package plugin.demo.shardingsphere.xa.config;//package authentication.config;
//
//import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
//
//import javax.sql.DataSource;
//import java.util.Map;
//
///**
// * @Author: Qiao Hang
// * @CreateDate: 2021/4/20 下午4:16
// * @UpdateDate:
// * @Description:
// */
//public class DynamicDataSource extends AbstractRoutingDataSource {
//
//    private Map<Object,Object> dataSources = null;
//
//    private static long slaveSize = 0;
//    private static final String SLAVE_FORMAT = "slave%s";
//
//    public DynamicDataSource(Map<Object, Object> dataSourceMap){
//        super();
//        if(dataSourceMap != null){
//            this.dataSources = dataSourceMap;
//            slaveSize = this.dataSources.keySet().stream().filter(x -> !x.equals("master"))
//                    .count();
//        }
//        super.setTargetDataSources(this.dataSources);
//    }
//
//    @Override
//    public void afterPropertiesSet() {
//        /*Do Nothing.*/
//    }
//
//    @Override
//    protected DataSource determineTargetDataSource() {
//        DataSourceConfig.DBRouter router = determineCurrentLookupKey();
//        if(router == null){
//            throw new IllegalArgumentException("Type of choose Datasource is null.");
//        }
//
//        DataSource dataSource = null;
//        switch (router){
//            case Master:
//                dataSource = DataSource.class.cast(router.name().toLowerCase());
//                break;
//            case Slave:
//                if(slaveSize != 0){
//                    String slaveIdentity = String.format(SLAVE_FORMAT, System.currentTimeMillis() % slaveSize);
//                    dataSource = (DataSource) dataSources.get(slaveIdentity);
//                }
//                break;
//            default:
//                break;
//        }
//
//        if (dataSource == null) {
//            throw new IllegalStateException("Cannot determine target DataSource not find.");
//        }
//        return dataSource;
//    }
//
//    @Override
//    protected DataSourceConfig.DBRouter determineCurrentLookupKey() {
//        // 获取目标方法. 获取上层注解 @ChangeDataSource(DBRouter.Muster) / others.
//        // 如果没有任何注解，要求必须为 查询Slave
//        return DataSourceConfig.DBRouter.Slave;
//    }
//
//}
